class AuctionService {

    def commitmentService

    boolean transactional = true

    /**
     * Kończy aukcje jeśli ich czas już minął
     */
    def finishAuctions() {

        //aukcje, które się zakończyły, a nie były jeszcze przetworzone
        def finishedAuctions = Auction.findAllByFinishLessThanAndFinished(new Date(), false)

        finishedAuctions.each {
            def winnerOffer = getWinnerOffer(it)
            if (winnerOffer) {
                //pobiera z konta zaoferowane brykiety
                commitmentService.createCommitmentForAuction(winnerOffer)
            }

            it.finished = true
        }

    }

    /**
     * Wyszukuje zwycięską ofertę w aukcji
     * Jeśli w aukcji nie było ofert, zwraca null
     */
    def getWinnerOffer(Auction auction) {

        if (auction.offers.size() == 0) {
            return null
        }

        /*
         * Sprawdza czy prowadzącego w aukcji stać na zaoferowaną cenę 
         * (mógł wygrać inną aukcję),
         * jeśli nie, to oferta jest usuwana.
         */
        def offersList = auction.offers as List
        int i = 0
        Offer winnerOffer = offersList[i]
        while (winnerOffer.person.getBalance() < winnerOffer.price) {
            
            auction.removeFromOffers(winnerOffer)
            winnerOffer.delete()

            if (++i < offersList.size()) {
                winnerOffer = offersList[i]
            }
            else {
                return null
            }
        }

        return winnerOffer
    }
}
